/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidor.bbdd.subsistema2;

import beans.Administrador;
import beans.ControlInscripcionsDTO;
import beans.Estudiant;
import beans.Constants;
import beans.GuanyadorRonda;
import beans.Prova;
import beans.ResponsableEvents;
import beans.Ronda;
import beans.Usuari;
import beans.RespostaCorrecta;
import beans.RondaDTO;
//import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const;
import common.EOlympicsException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import servidor.bbdd.GestorDiscoConexion;

/**
 *
 * @author Daniel
 */
public class GestorSubsistema2 {
    private GestorDiscoConexion gestorBD;
    java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/subsistema1/messagesSubsistema1"); // NOI18N
    public GestorSubsistema2(GestorDiscoConexion pGestor){
        super();
        this.gestorBD = pGestor;
    }
    
    /*
     * Retorna la llista de les respostes d'una ronda
     *  @param Ronda ronda
     */
    public List <RespostaCorrecta> getLlistaRespostes(Ronda ronda) throws EOlympicsException
    {
        System.out.println("Consulta de les Preguntes."); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
        List<RespostaCorrecta> sortida=new LinkedList();
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append(" select idProva a1, tipusRonda a2, numPregunta a3, opcioCorrecta a4, dataAlta a5, usuariAlta a6, dataBaixa a7, usuariBaixa a8, dataMod a9, usuariMod a10 from respostacorrecta  ");                
                query.append(" where 1=1 ");                
                query.append(" and idProva=? ");                
                query.append(" and tipusRonda=? ");                                   
                query.append(" order by numPregunta ");                                   
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);               
                    st.setInt(1,ronda.getIdProva().intValue());
                    st.setString(2,ronda.getTipusRonda());
               	rs = st.executeQuery();
                while (rs.next()) {
                        RespostaCorrecta rc =new RespostaCorrecta(new Integer(rs.getInt("a1")),
                                rs.getString("a2"),new Integer(rs.getInt("a3")),
                                rs.getString("a4"),rs.getDate("a5"),
                                new Integer(rs.getInt("a6")),rs.getDate("a7"),
                                new Integer(rs.getInt("a8")),rs.getDate("a9"),
                                new Integer(rs.getInt("a10")));
                        sortida.add(rc); 
 		}
 	}catch (SQLException e) {
 		throw new EOlympicsException(e.getMessage()); 
                // return null
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        

                        return sortida;
 		}catch(Exception e){ 			
                        throw new EOlympicsException(e.getMessage()); 
                        //return null;
 		}
 	}
 
    }
    
    /*
     * Cerca les proves, accepta els paràmetres de la prova que s'han definit al document
     *  @param Prova prova
     */
    public List<Prova> getLlistaProves(Prova prova)throws EOlympicsException{
        System.out.println("Consulta de les Proves."); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;
        List sortida=new LinkedList();
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append(" select idprova a1,descripcio a2,datainiinscripcio a3,datafiinscripcio a4,nombreplaces a5,estat a6,dataalta a7, usuarialta a8, databaixa a9, usuaribaixa a10, datamod a11, usuarimod a12 from prova ");                
                query.append(" where 1=1 ");
                if(prova.getIdProva()!=null)                    
                    query.append(" and idProva=? ");
                if(prova.getDescripcio()!=null)
                    query.append(" and descripcio=? ");
                if(prova.getDataIniInscripcio()!=null)
                    query.append(" and dataIniInscripcio=? ");
                if(prova.getDataFiInscripcio()!=null)
                    query.append(" and dataFiInscripcio=? ");
                query.append(" order by idprova ");

                   int i=1;
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
               if(prova.getIdProva()!=null)                    
                    st.setInt(i++,prova.getIdProva().intValue());
                if(prova.getDescripcio()!=null)
                    st.setString(i++,prova.getDescripcio());
                if(prova.getDataIniInscripcio()!=null)
                    st.setDate(i++, new java.sql.Date(prova.getDataIniInscripcio().getTime()));
                if(prova.getDataFiInscripcio()!=null)
                    st.setDate(i++, new java.sql.Date(prova.getDataFiInscripcio().getTime()));

 		rs = st.executeQuery();
                while (rs.next()) {
                        Prova provas =new Prova(new Integer(rs.getInt("a1")),
                        rs.getString("a2"),rs.getDate("a3"),
                        rs.getDate("a4"),new Integer(rs.getInt("a5")),
                        rs.getString("a6"),rs.getDate("a7"),
                        new Integer(rs.getInt("a8")),rs.getDate("a9"),
                        new Integer(rs.getInt("a10")),rs.getDate("a11"),
                        new Integer(rs.getInt("a12")));
                        sortida.add(provas); 
 		}
 	}catch (SQLException e) {
 		throw new EOlympicsException(e.getLocalizedMessage());
                //return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        return sortida;
 		}catch(Exception e){
                        throw new EOlympicsException(e.getMessage()); 
 			//e.printStackTrace();
                        //return null;
 		}
 	}

    }



    
    /*
     *  Recompte dels inscrits a una prova
     *  @param Prova prova
     */
    public Integer recomptaInscrits(Prova prova)throws EOlympicsException{
        System.out.println("Recompta inscrits"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;        
        Integer i = null;
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append(" select count(*) a1 from inscripcio where idprova=? ");                                
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setInt(1,prova.getIdProva().intValue());
 		rs = st.executeQuery();
                if (rs.next()) {
                        i=new Integer((rs.getInt("a1")));                        
 		}
 	}catch (SQLException e) {
                throw new EOlympicsException(e.getMessage()); 
 		//e.printStackTrace();
                //return null;
 	}
 	finally{
 		try{
 			rs.close();
 			st.close();
                        
                        return i;
 		}catch(Exception e){
                        throw new EOlympicsException(e.getMessage()); 
 			//e.printStackTrace();
                        //return null;
 		}
 	}

    }

    /* 
     *  Carrega d'una ronda
     *  @Param Ronda ronda
     */
    
        public Ronda carregaRonda(Ronda ronda)throws EOlympicsException{
        System.out.println("Carrega una ronda"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;        
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append(" select idProva a1, tipusRonda a2, nombrePreguntes a3, dataIniciRealitzacio a4, dataFiRealitzacio a5, dataAlta a6, usuariAlta a7, dataBaixa a8, usuariBaixa a9, dataMod a10, usuariMod a11 from ronda ");                
                query.append(" where idprova=? and tipusronda=?");
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);               
                st.setInt(1,ronda.getIdProva().intValue());
                st.setString(2,ronda.getTipusRonda());               
 		rs = st.executeQuery();
                ronda=null;
                if (rs.next()) {                       
                        ronda=new Ronda(new Integer(rs.getInt("a1")),
                        rs.getString("a2"),
                        new Integer(rs.getInt("a3")),
                        rs.getDate("a4"),
                        rs.getDate("a5"),
                        rs.getDate("a6"),
                        new Integer(rs.getInt("a7")),
                        rs.getDate("a8"),
                        new Integer(rs.getInt("a9")),
                        rs.getDate("a10"),
                        new Integer(rs.getInt("a11")));
 		}
                rs.close();
                st.close();
                
                return ronda;
 	}catch (SQLException e) {
                throw new EOlympicsException(e.getMessage()); 
 		//e.printStackTrace();                
 	}
 	//return null;
    }
        
 
        
        /*
         * Carrega una prova
         * @param Prova prova
         */
    public Prova carregaProva(Prova prova)throws EOlympicsException{
    System.out.println("Carrega una prova"); 		
    PreparedStatement st = null;
    ResultSet rs = null;        
    try { 		
 		StringBuffer query = new StringBuffer();
                query.append(" select idprova a1,descripcio a2,datainiinscripcio a3,datafiinscripcio a4,nombreplaces a5,estat a6,dataalta a7, usuarialta a8, databaixa a9, usuaribaixa a10, datamod a11, usuarimod a12 from prova ");                
                query.append(" where 1=1 ");
                if(prova.getIdProva()!=null)                    
                    query.append(" and idProva=? ");
                if(prova.getDescripcio()!=null)
                    query.append(" and descripcio=? ");
                if(prova.getDataIniInscripcio()!=null)
                    query.append(" and dataIniInscripcio=? ");
                if(prova.getDataFiInscripcio()!=null)
                    query.append(" and dataFiInscripcio=? ");

                   int i=1;
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
               if(prova.getIdProva()!=null)                    
                    st.setInt(i++,prova.getIdProva().intValue());
                if(prova.getDescripcio()!=null)
                    st.setString(i++,prova.getDescripcio());
                if(prova.getDataIniInscripcio()!=null)
                    st.setDate(i++, new java.sql.Date(prova.getDataIniInscripcio().getTime()));
                if(prova.getDataFiInscripcio()!=null)
                    st.setDate(i++, new java.sql.Date(prova.getDataFiInscripcio().getTime()));
                prova=null;
 		rs = st.executeQuery();
                if (rs.next()) {
                        prova =new Prova(new Integer(rs.getInt("a1")),
                        rs.getString("a2"),
                        rs.getDate("a3"),
                        rs.getDate("a4"),
                        new Integer(rs.getInt("a5")),
                        rs.getString("a6"),
                        rs.getDate("a7"),
                        new Integer(rs.getInt("a8")),
                        rs.getDate("a9"),
                        new Integer(rs.getInt("a10")),
                        rs.getDate("a11"),
                        new Integer(rs.getInt("a12")));
                        
 		}
                rs.close();
                st.close();
                
                return prova;

 	}catch (SQLException e) {
                throw new EOlympicsException(e.getMessage()); 
 		//e.printStackTrace();
                //return null;
 	}
    }

    /*
     * Alta d'una prova, fa l'inserció dins la BD
     *  @Param Prova prova
     *  la data de modificació la posa el servidor
     * 
     */
    
    public Prova alta(Prova prova)throws EOlympicsException{        
        PreparedStatement st = null;
 	ResultSet rs = null;                
        try{
                StringBuffer query= new StringBuffer();
                query.append(" INSERT INTO prova (descripcio, dataIniInscripcio, dataFiInscripcio, nombrePlaces, estat, dataAlta, usuariAlta) VALUES (?,?,?,?,?,?,?);");
                st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                st.setString(1, prova.getDescripcio());
                st.setDate(2,new java.sql.Date(prova.getDataIniInscripcio().getTime()));
                st.setDate(3,new java.sql.Date(prova.getDataFiInscripcio().getTime()));
                st.setInt(4, prova.getNombrePlaces().intValue());
                st.setString(5,prova.getEstat());
                st.setDate(6,new java.sql.Date(new Date().getTime()));
                st.setInt(7,prova.getUsuariAlta().intValue());
                st.execute();

        }catch(Exception e){
                e.printStackTrace();
        }
        finally{
        try{                	
                    st.close();  

        }catch(Exception e){
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
        }        
 	System.out.println("insercio finalitzada!");
        prova=carregaProva(prova);    
        return prova;
    }
    
    /*
     *  Alta d'una ronda
     *  Crea el registre nou dins la BD
     *  @param Ronda ronda
     */
    public Ronda alta(Ronda ronda)throws EOlympicsException{  
        ronda.setDataAlta(new Date());
        PreparedStatement st = null;
 	ResultSet rs = null;                
        try{
            StringBuffer query= new StringBuffer();
            query.append("insert INTO ronda(idProva, tipusRonda, nombrePreguntes, dataIniciRealitzacio, dataFiRealitzacio, dataAlta, usuariAlta)  VALUES (?,?,?,?,?,?,?)");
            st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            st.setInt(1, ronda.getIdProva().intValue());
            st.setString(2,ronda.getTipusRonda());
            st.setInt(3,ronda.getNombrePreguntes().intValue());
            st.setDate(4, new java.sql.Date(ronda.getDataIniciRealitzacio().getTime()));
            st.setDate(5, new java.sql.Date(ronda.getDataFiRealitzacio().getTime()));
            st.setDate(6, new java.sql.Date(ronda.getDataAlta().getTime()));
            st.setInt(7,ronda.getUsuariAlta().intValue());
            st.execute();
        }catch(Exception e){
            throw new EOlympicsException(e.getMessage()); 
            //e.printStackTrace();
        }
        finally{
        try{                	
            st.close();  

        }catch(Exception e){
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
        }        
 	System.out.println("insercio finalitzada!");
        return carregaRonda(ronda);
    }
        
    /*
     * Carrega una resposta correcta
     * @param RespostaCorrecta respostaCorrecta
     */
  public RespostaCorrecta carregaRespostaCorrecta(RespostaCorrecta respostaCorrecta)throws EOlympicsException
  {
        System.out.println("Carrega una RespostaCorrecta"); 		
 	PreparedStatement st = null;
 	ResultSet rs = null;        
 	try { 		
 		StringBuffer query = new StringBuffer();
                query.append(" select idProva a1, tipusRonda a2, numPregunta a3, opcioCorrecta a4, dataAlta a5, usuariAlta a6, dataBaixa a7, usuariBaixa a8, dataMod a9, usuariMod a10");                
                query.append(" from respostacorrecta ");                
                query.append(" where 1=1 ");                
                query.append(" and idProva=? ");
                query.append(" and tipusronda=? ");
                query.append(" and numpregunta=? ");
                int i=1;
 		st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                st.setInt(1,respostaCorrecta.getIdProva().intValue());
                st.setString(2,respostaCorrecta.getTipusRonda());
                st.setInt(3, respostaCorrecta.getNumPregunta().intValue());
                respostaCorrecta=null;
 		rs = st.executeQuery();
                if (rs.next()) {
                        respostaCorrecta=new RespostaCorrecta(new Integer(rs.getInt("a1")),
                        rs.getString("a2"),new Integer(rs.getInt("a3")),
                        rs.getString("a4"),rs.getDate("a5"),new Integer(rs.getInt("a6")),
                        rs.getDate("a7"),new Integer(rs.getInt("a8")),
                        rs.getDate("a9"),new Integer(rs.getInt("a10")));
 		}
                rs.close();
                st.close();
                
                return respostaCorrecta;

 	}catch (SQLException e) {
                throw new EOlympicsException(e.getMessage()); 
 		//e.printStackTrace();
                //return null;
 	}
      
  }
        
        
        
        

    /*
   * mètode per ageir i/o modificar les respostes, farà l'opció addient segons el cas
   * @param Ronda ronda
   * @param List<RespostaCorrecta> lista
   * @param usuari
   * 
   * posa la data de modificació creació segons pertoqui
   */
    
    public void afegirRespostes(Ronda ronda,List<RespostaCorrecta> respostes,int usuari)throws EOlympicsException
    {
        System.out.println("Afegint respostes "+respostes.size());
        for(RespostaCorrecta resposta: respostes)
        {
            System.out.println("Afegint resposta "+resposta.getNumPregunta());
            RespostaCorrecta respostaCorrecta=carregaRespostaCorrecta(resposta);
            if (respostaCorrecta==null)
            {                
                System.out.println("Es nova, la afegim");
                resposta.setUsuariAlta(new Integer(usuari));
                resposta.setDataAlta(new Date());
                alta(resposta);
            }
            else
            {
                System.out.println("modificam una existent");
                respostaCorrecta.setOpcioCorrecta(resposta.getOpcioCorrecta());
                respostaCorrecta.setUsuariMod(new Integer(usuari));
                respostaCorrecta.setDataMod(new Date());
                modifica(respostaCorrecta);
            }
        }
    }
    
    
    /*
     * d'ona d'alta una resposta correcta
     * @param RespostaCorrecta respostaCorrecta
     */
    public RespostaCorrecta alta(RespostaCorrecta respostaCorrecta)throws EOlympicsException{        
        PreparedStatement st = null;
 	ResultSet rs = null;                
        respostaCorrecta.setDataAlta(new Date());
        try{
                StringBuffer query= new StringBuffer();
                query.append("INSERT INTO respostacorrecta(idProva, tipusRonda, numPregunta, opcioCorrecta, dataAlta, usuariAlta) VALUES (?,?,?,?,?,?); ");
                st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                st.setInt(1, respostaCorrecta.getIdProva().intValue());
                st.setString(2,respostaCorrecta.getTipusRonda());
                st.setInt(3,respostaCorrecta.getNumPregunta().intValue());
                st.setString(4, respostaCorrecta.getOpcioCorrecta());                
                st.setDate(5,new java.sql.Date(respostaCorrecta.getDataAlta().getTime()));
                st.setInt(6,respostaCorrecta.getUsuariAlta().intValue());
                st.execute();
                System.out.println("pos ->"+respostaCorrecta.getOpcioCorrecta());
        }catch(Exception e){
                e.printStackTrace();
        }
        finally{
        try{                	
                    st.close();  

        }catch(Exception e){
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
        }        
 	System.out.println("insercio finalitzada!");    
        return respostaCorrecta;
    }

    
    /*
     * Modificar una prova
     * @param Prova prova
     * 
     */
    public Prova modifica(Prova prova)throws EOlympicsException{
        prova.setDataMod(new Date());
        PreparedStatement st = null;
 	ResultSet rs = null;                
        try{
                StringBuffer query= new StringBuffer();
                query.append(" update prova  set descripcio=?, dataIniInscripcio=?, dataFiInscripcio=?, nombrePlaces=?, estat=?, dataMod=?, usuariMod=? where idprova=?");
                st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                st.setString(1, prova.getDescripcio());
                st.setDate(2,new java.sql.Date(prova.getDataIniInscripcio().getTime()));
                st.setDate(3,new java.sql.Date(prova.getDataFiInscripcio().getTime()));
                st.setInt(4, prova.getNombrePlaces().intValue());
                st.setString(5,prova.getEstat());
                st.setDate(6,new java.sql.Date(prova.getDataMod().getTime()));
                st.setInt(7,prova.getUsuariMod().intValue());
                st.setInt(8,prova.getIdProva().intValue());
                st.execute();
        }catch(Exception e){
                //e.printStackTrace();
                throw new EOlympicsException(e.getMessage()); 
        }
        finally{
        try{                	
                    st.close();  
                    return carregaProva(prova);

        }catch(Exception e){
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
        }         	
        //return null;
    }
    
    /*
     * Modificar una ronda
     * @param Ronda ronda
     */
    public Ronda modifica(Ronda ronda)throws EOlympicsException{
        ronda.setDataMod(new Date());
        PreparedStatement st = null;
 	ResultSet rs = null;                
        try{
                StringBuffer query= new StringBuffer();
                query.append("update ronda set  nombrePreguntes=?, dataIniciRealitzacio=?, dataFiRealitzacio=?, dataMod=?,usuariMod=?  where idProva=? and tipusRonda=?;");
                st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                st.setInt(1,ronda.getNombrePreguntes().intValue());
                st.setDate(2, new java.sql.Date(ronda.getDataIniciRealitzacio().getTime()));
                st.setDate(3, new java.sql.Date(ronda.getDataFiRealitzacio().getTime()));
                st.setDate(4, new java.sql.Date(ronda.getDataMod().getTime()));
                st.setInt(5,ronda.getUsuariMod().intValue());
                st.setInt(6, ronda.getIdProva().intValue());
                st.setString(7,ronda.getTipusRonda()); 
                st.execute();
        }catch(Exception e){
                e.printStackTrace();
        }
        finally{
        try{                	
                    st.close();  
                    return carregaRonda(ronda);

        }catch(Exception e){
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
        }        
 	//return null;
    }     
    /*
     * Modificar una Resposta correcta
     * @param RespostaCorrecta respostaCorrecta
     */
    public void modifica(RespostaCorrecta respostaCorrecta)throws EOlympicsException
    {        
        PreparedStatement st = null;
 	ResultSet rs = null;                
        respostaCorrecta.setDataMod(new Date());
        try{
                StringBuffer query= new StringBuffer();
                query.append(" update respostacorrecta set  opcioCorrecta=?, dataMod=?, usuariMod=? where idProva=? and tipusRonda=? and numPregunta=? ");
                st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                st.setString(1, respostaCorrecta.getOpcioCorrecta());
                st.setDate(2,new java.sql.Date(respostaCorrecta.getDataMod().getTime()));                                
                st.setInt(3, respostaCorrecta.getUsuariMod().intValue());
                st.setInt(4,respostaCorrecta.getIdProva().intValue());
                st.setString(5,respostaCorrecta.getTipusRonda());
                st.setInt(6,respostaCorrecta.getNumPregunta().intValue());
                st.execute();
                System.out.println("pos ->"+respostaCorrecta.getOpcioCorrecta());
        }catch(Exception e){
                //e.printStackTrace();
                throw new EOlympicsException(e.getMessage()); 
        }
        finally{
        try{                	
                    st.close();  

        }catch(Exception e){
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
        }        
 	System.out.println("modificació finalitzada!");

    }
    
        /*
     * mostrar el control d'inscripcions     
     */
        public List<ControlInscripcionsDTO> mostraControlInscripcions()throws EOlympicsException
        {
            System.out.println("Consulta de les ControlInscripcions."); 		
            PreparedStatement st = null;
            ResultSet rs = null;
            List sortida=new LinkedList();
            try { 		
                    StringBuffer query = new StringBuffer();
                    query.append(" select pro.descripcio a1,pro.nombreplaces a2,pro.estat a3,count(idestudiant) a4");
                    query.append(" from prova pro left join inscripcio ins on pro.idprova=ins.idprova");                    
                    query.append(" where pro.datafiinscripcio<now()");
                    query.append(" and pro.estat in(?,?)");
                    query.append(" group by pro.descripcio,pro.nombreplaces,pro.estat");                       
                    st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setString(1,Constants.PROVA_EN_PROCES_INSCRIPCIO);
                    st.setString(2,Constants.PROVA_EN_CLASSIFICACIO_PREVIA);
                    rs = st.executeQuery();
                    while (rs.next()) {        
                            ControlInscripcionsDTO controlInscripcionsDTO =new ControlInscripcionsDTO(rs.getString("a1"),
                            new Integer(rs.getInt("a2")),new Integer(rs.getInt("a4")),rs.getString("a3"));
                            sortida.add(controlInscripcionsDTO); 
                    }
            }catch (SQLException e) {
                    throw new EOlympicsException(e.getMessage()); 
                    //e.printStackTrace();
                    //return null;
            }
            finally{
                    try{
                            rs.close();
                            st.close();
                            

                            return sortida;
                    }catch(Exception e){
                            e.printStackTrace();
                            return null;
                    }
            }
        }

        /* 
         * tancar les inscripcions
         * si n o s'arriba al minim es considera deserta 
         * si hi ha més inscrits que per a la final es posa ronda eliminatoria
         * si no es posa ronda final
         * 
         * @param codiUsuari(administrador)
         * @param minim de participants a una prova
         */
        public void tancaInscripcions(int usuari,int minim)throws EOlympicsException
        {
            PreparedStatement st = null;
            ResultSet rs = null;                
            
            try{
                    StringBuffer query= new StringBuffer();
                    // indicam les desertes
                    System.out.println("pasa 1");
                    query.append(" update prova set estat=?,datamod=now(),usuarimod=? where datafiinscripcio<now() and estat=? and (select count(*) from inscripcio ins where prova.idprova=ins.idprova)<?");
                    st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setString(1, Constants.PROVA_DESERTA);
                    st.setInt(2, usuari);
                    st.setString(3, Constants.PROVA_EN_PROCES_INSCRIPCIO);
                    st.setInt(4, minim);
                    st.execute();
                    query= new StringBuffer();
                    // indicam les prèvies
                    query.append(" update prova set estat=?,datamod=now(),usuarimod=? where datafiinscripcio<now() and estat=? and (select count(*) from inscripcio ins where prova.idprova=ins.idprova)>?");
                    st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setString(1, Constants.PROVA_EN_COMPETICIO_PREVIA);                    
                    st.setInt(2, usuari);                    
                    st.setString(3, Constants.PROVA_EN_PROCES_INSCRIPCIO);                    
                    st.setInt(4, Constants.NUM_CLASSIFICATS_RONDA_FINAL);                    
                    st.execute();
                    // la resta són finals                    
                    query= new StringBuffer();                    
                    query.append(" update prova set estat=?,datamod=now(),usuarimod=?");
                    query.append(" where datafiinscripcio<now() and estat in(?,?)");
                    st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setString(1, Constants.PROVA_EN_COMPETICIO_FINAL);                    
                    st.setInt(2, usuari);                    
                    st.setString(3, Constants.PROVA_EN_PROCES_INSCRIPCIO);                    
                    st.setString(4, Constants.PROVA_EN_CLASSIFICACIO_PREVIA);                    
                    st.execute();
            }catch(Exception e){                
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
            finally{
            try{                	
                        st.close();  

            }catch(Exception e){
                        //e.printStackTrace();
                        throw new EOlympicsException(e.getMessage()); 
                }
            }        
            System.out.println("modificació finalitzada!");

        }
        
        
        /* 
         * cercar les competicions actives
         */
        public List<RondaDTO> cercarCompteticionsActives()throws EOlympicsException
        {
            System.out.println("Consulta estat de les Rondes."); 		
            PreparedStatement st = null;
            ResultSet rs = null;
            List sortida=new LinkedList();
            try { 		
                    StringBuffer query = new StringBuffer();
                    query.append(" select prova.idprova a1,tipusronda a2,descripcio a3");
                    query.append(" from prova,ronda ");
                    query.append(" where estat in (?,?)");
                    query.append(" and prova.idprova=ronda.idprova");
                    query.append(" and now()>datafirealitzacio");
                    query.append(" and not exists(select 'x' from guanyadorronda gr where gr.idprova=ronda.idprova and gr.tipusronda=ronda.tipusronda)");
                    st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setString(1, Constants.PROVA_EN_COMPETICIO_FINAL);
                    st.setString(2, Constants.PROVA_EN_COMPETICIO_PREVIA);
                    rs = st.executeQuery();
                    while (rs.next()) {
                            System.out.println("trobat");
                            RondaDTO rondaDTO =new RondaDTO(new Ronda(
                                    new Integer(rs.getInt("a1")),
                                    rs.getString("a2")),
                                    rs.getString("a3"));
                            sortida.add(rondaDTO); 
                    }
            }catch (SQLException e) {
                    throw new EOlympicsException(e.getMessage()); 
                    //e.printStackTrace();
                    //return null;
            }
            finally{
                    try{
                            rs.close();
                            st.close();                            

                            return sortida;
                    }catch(Exception e){
                            throw new EOlympicsException(e.getMessage()); 
                            //e.printStackTrace();
                            //return null;
                    }
            }
            
        }
    
        /*
         * Donada una ronda es tanca
         * calculam les notes i inserim els guanyadors
         * marcam la prova com a finalitzada si és necessari
         * @param Ronda ronda
         */
        
        public void tancaCompeticio(Ronda ronda)throws EOlympicsException{
            PreparedStatement st = null;
            ResultSet rs = null;                
            
            try{
                    StringBuffer query= new StringBuffer();
                    // calculam els resultats i la classificació
                    
                    query.append(" select a.idprova a1,a.tipusronda a2,a.idestudiant a3,sum(a.encert) encerts,sum(a.blanc)blancs,sum(a.errada)errades,round(sum(a.encert)-(sum(a.errada/2.0)),1) nota from(");
                    query.append(" select rc.idprova,rc.tipusronda,rc.numpregunta,rc.opciocorrecta,re.opciomarcada,pa.idestudiant,");
                    query.append(" case when opciomarcada=opciocorrecta then 1 else 0 end encert,");
                    query.append(" case when opciomarcada isnull then 1 else 0 end blanc,");
                    query.append(" case when not(opciomarcada isnull) and opciomarcada<>opciocorrecta then 1 else 0 end errada");
                    query.append(" from respostacorrecta rc inner join  participacio pa on rc.idprova=pa.idprova and rc.tipusronda=pa.tipusronda");
                    query.append(" left join respostaestudiant re on rc.idprova=re.idprova and rc.tipusronda=re.tipusronda and rc.numpregunta=re.numpregunta and re.idestudiant=pa.idestudiant");
                    query.append(" where rc.idprova=?");
                    query.append(" and rc.tipusronda=?) a");
                    query.append(" group by a.idprova,a.tipusronda,a.idestudiant");
                    query.append(" order by nota desc");
                    st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setInt(1,ronda.getIdProva().intValue());
                    st.setString(2,ronda.getTipusRonda());                    
                    rs = st.executeQuery();
                    int i=1;
                    while (rs.next()) {
                            System.out.println("calculant notes");                                                        
                            modificaParticipacio(ronda.getIdProva().intValue(),
                                    ronda.getTipusRonda(),
                                    rs.getInt("a3"),
                                    rs.getInt("encerts"),
                                    rs.getInt("errades"),
                                    rs.getInt("blancs"),
                                    rs.getFloat("nota"));
                            GuanyadorRonda guanyadorRonda=new GuanyadorRonda(ronda.getIdProva(),
                                    ronda.getTipusRonda(),
                                    new Integer(rs.getInt("a3")),
                                    new Integer(i++));
                            alta(guanyadorRonda);
                    }
                    //tancaProva(ronda.getIdProva()); // si és necessari ara es fa al client
            }catch(Exception e){                
                    //e.printStackTrace();
                    throw new EOlympicsException(e.getMessage()); 
            }
            finally{
            try{                	
                        st.close();  

            }catch(Exception e){
                        //e.printStackTrace();
                        throw new EOlympicsException(e.getMessage()); 
                }
            }        
            System.out.println("modificació finalitzada!");

        }
        
        /* modifica les participacions
         * @param int idprova
         * @param String tipusRonda
         * @param int idEstudiant
         * @param int encertades
         * @param int errades
         * @param int blanc
         * @param int nota
         */
        public void modificaParticipacio(int idProva,String tipusRonda,int idEstudiant,int encertades,int errades,int blanc,float nota)throws EOlympicsException{
            PreparedStatement st = null;
            ResultSet rs = null;                
            
            try{
                    StringBuffer query= new StringBuffer();                               
                    query.append(" update participacio set respostesencertades=?,respostesfallades=?,respostesblanc=?,nota=? where idprova=? and tipusronda=? and idestudiant=? ");
                    st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setInt(1, encertades);
                    st.setInt(2, errades);
                    st.setInt(3, blanc);
                    st.setFloat(4, nota);
                    st.setInt(5, idProva);
                    st.setString(6, tipusRonda);
                    st.setInt(7, idEstudiant);
                    st.execute();
            }catch(Exception e){                
                    e.printStackTrace();
            }
            finally{
            try{                	
                        st.close();  

            }catch(Exception e){
                        //e.printStackTrace();
                        throw new EOlympicsException(e.getMessage()); 
                }
            }        
            System.out.println("modificació finalitzada!");
           
        }

        /* 
         * inserir els guanyador de la ronda
         * @param GuanyadorRonda guanyadorRonda
         */
        public void alta(GuanyadorRonda guanyadorRonda)throws EOlympicsException
        {
            PreparedStatement st = null;
            ResultSet rs = null;                
            
            try{
                    StringBuffer query= new StringBuffer();                                        
                    query.append(" insert into guanyadorronda(idProva, TipusRonda, idEstudiant, posicioOcupada) values(?,?,?,?)");
                    st=gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    st.setInt(1, guanyadorRonda.getIdProva().intValue());
                    st.setString(2, guanyadorRonda.getTipusRonda());
                    st.setInt(3, guanyadorRonda.getIdEstudiant().intValue());
                    st.setInt(4, guanyadorRonda.getPosicioOcupada().intValue());
                    st.execute();
            }catch(Exception e){                
                    e.printStackTrace();
            }
            finally{
            try{                	
                        st.close();  

            }catch(Exception e){
                        //e.printStackTrace();
                        throw new EOlympicsException(e.getMessage()); 
                }
            }        
            System.out.println("alta finalitzada!");
            
        }
        
        
        /*
         * Si a totes les rondes d'una prova ja esta indicat el guanyador es pot tancar la prova
         * @param int idprova
         *  ara es fa al client
         
        public void tancaProva(int idprova)
        {
            PreparedStatement st = null;
            ResultSet rs = null;                
            
            try{
                 StringBuffer query= new StringBuffer();
                 query.append(" update prova set estat='Finalitzada' where idprova=? and (");
                 query.append(" select count(*)");
                 query.append(" from prova,ronda"); 
                 query.append(" where estat ='%ompetició%'"); 
                 query.append(" and prova.idprova=ronda.idprova");
                 query.append(" and ronda.idprova=?");
                 query.append(" and not exists(select 'x' from guanyadorronda gr where gr.idprova=ronda.idprova and gr.tipusronda=ronda.tipusronda))=0");
                 st = gestorBD.getConexion().prepareStatement(query.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                 st.setInt(1,idprova);                    
                 st.setInt(2,idprova); 
                 st.execute();                    

            }catch(Exception e){                
                    e.printStackTrace();
            }
            finally{
            try{                	
                        st.close();  

            }catch(Exception e){
                        e.printStackTrace();
                }
            }        
            System.out.println("modificació finalitzada!");

        }
*/
}